package com.wyx.jdbc.batch;

import com.wyx.jdbc.utility.JDBCUtils;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * @author 王艺锡
 * @version 1.0
 * 批量处理的使用
 */
public class batch_ {
    //当需要批量进行插入或者更新记录时，可以使用批量处理机制
    //addBatch():添加需要处理的语句或者参数到数据包中
    //executeBatch():执行批量处理
    //clearBatch():清空批量处理包中的数据
    //注:JDBC连接Mysql时，如果想要使用批量处理的功能，需要再url语句后加参数:?rewriteBatchedStatements=true


    //当不使用批处理的时候，添加5000条语句的耗时
    @Test
    public void noBatch() throws Exception {
        Connection connection = JDBCUtils.getConnection();
        String sql = "insert into admin2 values(null,?,?) ";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        System.out.println("开始执行");
        //记录开始时间
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            preparedStatement.setString(1, "jack" + i);
            preparedStatement.setString(2, "123");
            preparedStatement.executeUpdate();
        }
        long end = System.currentTimeMillis();
        System.out.println("用时:" + (end - start));
        JDBCUtils.close(null, preparedStatement, connection);

    }


    //使用批量处理
    @Test
    public void batch() throws Exception {
        Connection connection = JDBCUtils.getConnection();
        String sql = "insert into admin2 values(null,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        System.out.println("开始执行");
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            preparedStatement.setString(1, "jack" + i);
            preparedStatement.setString(2, "123");
            //将sql语句加入到批量处理包中
            preparedStatement.addBatch();
            //当有1000条语句时，批量执行
            if ((i + 1) % 1000 == 0) {
                //执行
                preparedStatement.executeBatch();
                //清空
                preparedStatement.clearBatch();
            }

        }
        long end = System.currentTimeMillis();
        System.out.println("用时:" + (end - start));
        JDBCUtils.close(null, preparedStatement, connection);

    }
}
